import _vueToObject from "./toObject";

/**
 * 添加或者修改对象，先依据ID判断是否有对象，无则添，有则改
 * @param { IndexedDBHelp } help 访问数据库的实例
 * @param { string } storeName 仓库名称（表名）
 * @param { Object } model 对象（数据记录）
 * @param { string } id 对象的ID
 * @param { IDBTransaction } tranRequest 如果使用事务的话，需要传递开启事务时创建的连接对象
 * @returns 添加记录的ID
 */
export default function setData(
  help,
  storeName,
  model,
  id,
  tranRequest = null
) {
  const _model = _vueToObject(model);
  return new Promise((resolve, reject) => {
    const _set = (__tran) => {
      // 先获取对象 然后修改 最后再存回去
      const store = __tran.objectStore(storeName);
      store.get(id).onsuccess = //获取对象
        (event) => {
          // 从仓库里提取对象，把修改至合并到对象里
          const res = event.target.result;
          if (typeof res === "undefined") {
            // 没有对象添加
            store.add(_model).onsuccess = //添加对象
              (event) => {
                resolve(event.target.result);
              };
          } else {
            // 修改
            const newObject = {};
            Object.assign(newObject, event.target.result, _model);
            // 修改数据
            store.put(newObject).onsuccess = // 修改对象
              (event) => {
                // 成功后的回调
                resolve(event.target.result);
              };
          }
        };
    };
    // 判断是否自带事务
    if (tranRequest === null) {
      help.beginWrite([storeName]).then((tran) => {
        // 自己开一个事务
        _set(tran);
      });
    } else {
      // 使用传递过来的事务
      _set(tranRequest);
    }
  });
}
